Day19的小練習:
Try1:試著用$data將範例中大麥克改成麥香雞,份數改成5份,單價改成109。
<body>
<div id="demo">
{{message}}
</br>
數量:{{amount}} 份
</br>
單價:{{price}} 元
</br>
總計:{{amount*price}} 元
</div>
<script>
const vm = Vue.createApp({
data() {
return {
message: '大麥克',
price: 199,
amount: 2
}
}
});
let newVm = vm.mount('#demo')
newVm.$data.message = '麥香雞';
newVm.$data.price = 109;
newVm.$data.amount = 5;
</script>
</body>
以上~
在Vue.js裡面,我們將重複使用的這些邏輯包裝起來,放在methods
屬性之中。
我們來改寫上面計算價格的例子:
<body>
<div id="demo">
{{message}}
</br>
數量:{{amount}} 份
</br>
單價:{{price}} 元
</br>
總計:{{sumtotal()}} 元
</div>
<script>
const vm = Vue.createApp({
data() {
return {
message: '大麥克',
price: 199,
amount: 2
}
},
methods:{
sumtotal: function(){
return this.price * this.amount;
}
}
}).mount('#demo');
</script>
</body>
從上述例子可以看到原本寫在總計裡面的{{amount*price}}
計算,
已經被換成我們寫在methods
裡面的{{sumtotal()}}
,這樣好處是,當如果有多個地方要計算,直接引入{{sumtotal}}
,程式碼看起來也不會比較亂。
這邊要注意的是this.price
和this.amount
,這邊是用this
存取原本在data
裡面的price
和amount
。
另外在methods
裡面的內容就是個函式function
,所以在使用時需要加入小括號sumtotal()
,如果有參數他也是可以傳進去的。
Vue.js提供了computed
來處理計算的問題,我們再將前面的程式用computed改寫:
<body>
<div id="demo">
{{message}}
</br>
數量:{{amount}} 份
</br>
單價:{{price}} 元
</br>
總計:{{sumTotal}} 元
</div>
<script>
const vm = Vue.createApp({
data() {
return {
message: '大麥克',
price: 199,
amount: 2
}
},
computed:{
sumTotal:function(){
return this.price * this.amount;
}
}
}).mount('#demo');
</script>
</body>
看起來寫法和上面的methods
寫法幾乎完全一樣呢!
只差在呼叫的時候用computed
寫的沒有()。
那有什麼差異呢?接著看下去:
<body>
<div id="demo">
{{message}}
</br>
數量:{{amount}} 份
</br>
單價:{{price}} 元
</br>
<!--我是用methods寫的-->
總計:{{sumtotalM()}} 元
</br>
總計:{{sumtotalM()}} 元
</br>
<!--我是用computed寫的-->
總計:{{sumtotalC}} 元
</br>
總計:{{sumtotalC}} 元
</div>
<script>
const vm = Vue.createApp({
data() {
return {
message: '大麥克',
price: 199,
amount: 2
}
},
methods:{
sumtotalM: function(){
console.log('methods')
return this.price * this.amount;
}
},
computed:{
sumtotalC:function(){
console.log('computed')
return this.price * this.amount;
}
}
}).mount('#demo');
</script>
</body>
我們改寫後,比較methods
和computed
,都各輸出兩次,在網頁上呈現的結果如下:
摁...很正常是四次,那兩個到底插在哪? 我們console一下:
咦computed
怎麼少一次?
原因是computed
會將計算後的結果暫存,若帶入的屬性(this.price,this.amount)沒有更新的情況下,就不會被重複執行。
如果都是計算重複的方法下,computed
的效能會比methods
來的好,但computed
無法帶入參數。computed
預設getter的方法,同時也提供了setter
的方法,這邊可以參照官網的例子Vue和Kuro大神的例子(在這頁的下半部),我個人覺得Kuro大神的例子相較起來更清楚(因為是中文?,這裡也可以練習把Kuro大神的換算匯率完成看看,可以加深對computed
的應用呦!
methods
和computed
的應用與比較明天見囉!